工作中遇到,写了很久以前的写法,师兄给了很多建议,于是整理了一下。孔子曰:“你知道茴香豆的茴字有几种写法吗?”
首先,要知道Set的特性是有序不重复,Jdk中使用了HashMap的Key作为Set的容器。
第一部分,基本类型&String
第一种,平常的写法:
public class App {
public static void main( String[] args ) {
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("5");
set.add("4");
set.add("3");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);//降序排列
}
});
sortSet.addAll(set);
System.out.println(sortSet.toString());
}
}
第二种,lambda:
public class App
{
public static void main( String[] args ) {
Set<String> set = new HashSet<>();
set.add("2");
set.add("1");
set.add("5");
set.add("3");
set.add("4");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>((o1, o2) -> o2.compareTo(o1));
sortSet.addAll(set);
System.out.println(sortSet.toString());
}
}
第三种:JDK api
public class App
{
public static void main( String[] args ) {
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
set.add("5");
set.add("4");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>(Comparator.reverseOrder());
sortSet.addAll(set);
System.out.println(sortSet.toString());
}
}
第四种:java8流的方式:
public class App
{
public static void main( String[] args ) {
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
set.add("4");
set.add("5");
System.out.println(set.toString());
//这里后续用有序的list处理即可,因为流中进行了倒序处理,收集成set后会重排
List<String> collect = set.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(collect);
}
}
第二部分,对象排序
package stream;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
* 事例2,对象排序
*/
public class Test2 {
public static void main( String[] args ) {
PersonObj person = new PersonObj(1L,"A",10);
PersonObj person1 = new PersonObj(2L,"B",20);
PersonObj person2 = new PersonObj(3L,"CC",30);
PersonObj person3 = new PersonObj(4L,"DD",40);
PersonObj person4 = new PersonObj(5L,"EE",50);
PersonObj person5 = new PersonObj(6L,"FF",60);
//对象组装,组装后内容无序
Set<PersonObj> set = new HashSet<>();
set.add(person3);
set.add(person4);
set.add(person5);
set.add(person);
set.add(person1);
set.add(person2);
System.out.println(set.toString());
//第一种方式,Person类实现 Comparable并重写compareTo方法
//set = new TreeSet<>(set);
//System.out.println(set.toString());
//第二种方式
TreeSet<PersonObj> objects = new TreeSet<>(((o1, o2) ->Integer.compare(o2.getAge(), o1.getAge())));
objects.addAll(set);
System.out.println(objects);
}
}
/**
* 被排序的对象实现Comparable
*/
class PersonObj implements Comparable{
private Long id;
private String name;
private int age;
@Override
public int compareTo(Object o) {
PersonObj student =(PersonObj)o;
//将当前this.age值与传入的参数中的o.age对比,返回正数则升序,返回负数则降序
return Integer.compare(student.age, this.age);
}
public PersonObj(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return this.name+"_"+this.id+"_"+this.age;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
}